CoreCLRで遊ぶ


概要

RC2になっても破壊的変更してるの個人的には好きです。

以前触った時はまだmono依存があったんだけど、現在(2016/01末)はもうmono依存なさげ。


適当な開発環境としてMac OS Xを使用して動かしている。インストールとか環境整備含めてものすごく楽になった。

インストールとかは公式からいける。ただ2点くらいハマった。

公式サイト

https://dotnet.github.io


ちなみに絶賛破壊的変更中とのことなので、今だ!やれよ!!!みたいなことは言わない。



簡単な紹介

公式からpkgをDL、実行すると dotnet って名前のコマンドラインツールが使えるようになる。

あとは


// 現在のdirにプロジェクトのコードとか設定ファイル一式がダイレクトに吐かれる

dotnet new 


// project.jsonとかに書かれた依存性を解決する

dotnet restore


// ビルド

dotnet build


// ビルドと実行

donet run


みたいなコマンドを実行するだけ。

メッチャお手軽にMac上でも動くC♯による成果物exeを吐くので、いいぞ~~~。


スクリーンショット 2016-01-31 2.00.19.png



ハマったところ



OpenSSL入れた後リンクコマンド打っとかないとnugetとの通信でエラーしまくる


単にbrewでopenssl入れただけだとダメで、


brew install openssl

brew link --force openssl


linkしないといけない。ちなみにインストラクションの中にOpenSSLについてのリンクが2個くらいあって、片っぽはbrew installしてるだけだったんでハマった。

これやっとかないと、新規プロジェクトを作成するScaffoldっぽいコマンドで大量の通信エラーが出る。


はじめ、原因が思いつかなくてなんだこりゃってなった。



System.Threading.Thread入れたコードがコンパイルエラーに成るんでコミュニティの人たちのお世話になるなどした

dotnet newで作成されるプロジェクト、依存してるものをproject.jsonとかに書くスタイルで、デフォルドではproject.jsonは以下のようになっている。


project.json

{

    "version": "1.0.0-*",

    "compilationOptions": {

        "emitEntryPoint": true

    },


    "dependencies": {

        "NETStandard.Library": "1.0.0-rc3-23727"

    },


    "frameworks": {

        "dnxcore50": { }

    }

}


NETStandard.Library っていうのがmscorlibみたいな物体で、いろんな標準ライブラリを含んでるっぽい。


で、


次のようなThreadをダイレクトに使ったコードをコンパイルしようとしたらコンパイルエラーになった。

using System;


namespace ConsoleApplication {

    public class Program {

        public static void Main(string[] args) {

System.Threading.Thread d;

Console.WriteLine("Hello World2!");

        }

    }

}


/Users/tomggg/test/app/Program.cs(7,21): error CS0234: The type or namespace name 'Thread' does not exist in the namespace 'System.Threading' (are you missing an assembly reference?)


えっ ThreadがThreadingに含まれてないの??マジで???ってなったんだけど、

問題の切り分けがしたくて色々コミュの人らに聞いてわかったこととして、


・NETStandard.Library にはSystem.Threading.Threadは含まれてない(今だけなのかは知らん

・使うにはdependenciesにSystem.Threading.Threadを書き加える必要がある(書き加えてrestoreしてrunしたら素晴らしくまともに動いた


ということだった。

具体的にはproject.jsonに書き加えて云々すればよかった。あれかな、この辺はIDEがやる前提なのかな。


{

    "version": "1.0.0-*",

    "compilationOptions": {

        "emitEntryPoint": true

    },


    "dependencies": {

"System.Threading.Thread":"1.0.0-rc3-23727",

        "NETStandard.Library": "1.0.0-rc3-23727"

    },


    "frameworks": {

        "dnxcore50": { }

    }

}



Thread使ってみたいんだけどエラー出てなぜなぜ?って言いに行ったら、親身になって聞いてくれる人の一方で「は??Task使いなよ??」って言われたのすごく新鮮だった。

気持ちはわかる。Task便利。


ちなみにTaskはnamespaceがSystem.Threading.Tasks で、これはNETStandard.Library に入っていた。

ド畜生がァ



生産物

https://github.com/sassembla/TestCoreCLR